package com.guan.mysolutionstudy;

import org.junit.Test;

import java.util.Arrays;

/**
 * @ClassName LongestCommonPrefix
 * @Author GuanCary
 * @Date 2020/5/12 19:03
 * @Version 1.0
 * Leetcode:  编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀，返回空字符串 ""。
 * 输入: ["flower","flow","flight"]
 * 输出: "fl"
 * myIdea:既然是查找公共字符串,我可以先进行排序,得到最短的字符串长度and最长的字符串长度,只需要对比最短和最长的比较公共字符串
 * 其他的不必比较,要充分理解公共字符串的这个条件
 **/
public class LongestCommonPrefix {
    public String solution1(String[] strings) {
        //增加一个不合法的参数提示,空参数
        if (!checkout(strings)) {
            return "";
        }
        //首先调用Arrays工具类排序strings
        Arrays.sort(strings);
        //排序完成得到差异最大的两个字符串
        //第一个字符串长度
        int num = strings[0].length();
        //最后一个字符串长度
        int num2 = strings[strings.length - 1].length();
        //比较其中长度比较小的,我们只需要比较到这个小一点的长度就行了
        int compareLength = Math.min(num, num2);
        //创建一个临时可变字符串
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < compareLength; i++) {
            if (strings[0].charAt(i) == strings[strings.length - 1].charAt(i)) {
                stringBuffer.append(strings[0].charAt(i));
            } else {
                if (stringBuffer.length() == 0) {
                    System.out.println("不存在公共前缀字符串");
                    return "";
                }
                System.out.println(stringBuffer.toString());
                return stringBuffer.toString();
            }
        }

        System.out.println(stringBuffer.toString() + "全部重合!");
        return stringBuffer.toString();
    }

    public boolean checkout(String[] strings) {
        if (strings == null && strings.length == 0) {
            System.out.println("输入数值不合法,全部为空参数或者null值");
            return false;
        } else {
            for (int i = 0; i < strings.length; i++) {
                //这里也可以把报错信息反过来写成!=null或者length不等于0,这样就不会出现NPE
                if (null == strings[i]) {
                    System.out.println("输入的第" + (i + 1) + "个字符是null");
                    return false;
                }
                //在空指针后边声明这个报错
                if (strings[i].length() == 0) {
                    System.out.println("输入的第" + (i + 1) + "个字符是空参数");
                    return false;
                }
            }
            return true;
        }
    }

    @Test
    public void Test() {
        solution1(new String[]{"flower", "flow", "flight"});
        //这里出现了一个问题,那就是第二个匹配,排序后为car 和racecar ,然后我就添加了上面循环append的跳出条件,只要有一项
        //不重合就跳出
        solution1(new String[]{"dog", "racecar", "car"});
        solution1(new String[]{null, "flow", "flight"});
        solution1(new String[]{"", "flow", "flight"});
    }
    //这个是我得字符串排序验证
    //我们了解到arrays的sort方法会把差异最大的两个字符串放在前后两端,如果前后两端都重合了,其他必定重合
/*    public static void main(String[] args) {
        String[] strings={"flower","flow","flight"};
        Arrays.sort(strings);
        //结果为[flight, flow, flower]
        System.out.println(Arrays.toString(strings));
        String[] strings1={"abc","ad","abce"};
        Arrays.sort(strings1);
        //[abc, abce, ad]按照字符顺序,数字放最前边,位数多的放后边
        System.out.println(Arrays.toString(strings1));
        String[] strings2={"abdf","abc","abd"};
        Arrays.sort(strings2);
        //[abc, abce, ad]
        System.out.println(Arrays.toString(strings2));
    }*/
}